/*
 * HistoricoGridVentas.java
 *
 * Created on 9 de noviembre de 2006, 05:59 PM
 */

package inc.jmc.cyberboard.ui.ventas;

import inc.jmc.cyberboard.common.DefaultLookAndFeel;
import inc.jmc.cyberboard.dao.Dao;
import inc.jmc.cyberboard.dao.HistoricoVentasDao;
import inc.jmc.cyberboard.common.NumFormat;
import inc.jmc.cyberboard.ui.ventas.common.VentasDetalleTableModel;
import inc.jmc.cyberboard.entitybeans.HistoricoVentas;
import inc.jmc.cyberboard.ui.ventas.common.VentasTableModel;
import java.awt.Dimension;
import java.sql.Connection;
import java.sql.SQLException;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.Iterator;
import java.util.List;
import java.util.Vector;
import javax.swing.JLabel;
import javax.swing.JTable;
import javax.swing.ListSelectionModel;
import javax.swing.event.ListSelectionEvent;
import javax.swing.event.ListSelectionListener;
import javax.swing.table.DefaultTableCellRenderer;
import javax.swing.table.TableColumn;
import org.apache.log4j.Logger;

/**
 *
 * @author  Juan Miguel Olguin Salguero
 */
public class HistoricoGridVentas extends javax.swing.JPanel {
    static Logger logger = Logger.getLogger(HistoricoGridVentas.class.getName());
    public static final Object[] header=new Object[]{"IdVenta","Vendedor","Fecha dd/mm/yyyy","Cantidad","Subtotal","IVA","Total"};    
    public static final int HEADER_IDVENTA        =0;
    public static final int HEADER_VENDEDOR       =1;
    public static final int HEADER_FECHA          =2;
    public static final int HEADER_CANTIDAD       =3;
    public static final int HEADER_SUBTOTAL       =4;
    public static final int HEADER_IVA            =5;
    public static final int HEADER_TOTAL          =6;
    
    VentasTableModel dtm;
    ArrayList dataProductos = new  ArrayList ();
    VentasManagerFrm parent;
    
    
    private int cantidadItems = 0;
    private float subtotalNoIva = 0;
    private float montoIva = 0;
    private float montoTotal = 0;

    
    public HistoricoGridVentas(VentasManagerFrm parent) {
        initComponents();
        this.parent = parent;
        try{
            this.queryType = HistoricoVentasDao.VENTA_MES_ACTUAL;
            loadProductsBD();
        }
        catch(Exception ex)
        {
            ex.printStackTrace();
            dtm=new VentasTableModel(new Object[][]{},
                header);
            this.updateTableUI();
        }
    }
    
    /**
     */
    private int queryType=0;
    private String fecha1="";
    private String fecha2="";
    
    public int rowCount()
    {
    	if(dtm!=null)
    	    return dtm.getRowCount();
    	else 
    		return 0;
    	
    }
    
    /**
     * Hace una recarga de datos en este grid, y lo refresca con lo que hay en la tabla
     * @throws Exception
     */
    public void loadProductsBD()throws Exception
    {
                HistoricoVentasDao recsDao=new HistoricoVentasDao();
                java.sql.Connection conn=Dao.getConnection();
                //java.util.ArrayList arry=recsDao.getAllProductos(conn);
                java.util.ArrayList arry=null;
                if(this.queryType == HistoricoVentasDao.VENTA_MES_ACTUAL)
                    arry = recsDao.getAllVentasThisMonth(conn);
                else
                {
                    arry = recsDao.getVentasWithCriteria(conn, queryType, fecha1, fecha2);
                }
                conn.close();
                dtm=new VentasTableModel(new Object[][]{},
                header);
                cantidadItems =0;
                subtotalNoIva =0;
                montoIva=0;
                montoTotal=0;
                for(int i=0;i<arry.size();++i)
                {
                    HistoricoVentas record=(HistoricoVentas)arry.get(i);
                    Vector recVector=new Vector();
                    recVector.add(record.getIdVenta());
                    recVector.add(record.getNombreUsuario());
                    recVector.add(record.getFecha());
                    recVector.add(record.getCantidadItems());
                    recVector.add(NumFormat.money(record.getSubtotalNoIva()));
                    recVector.add(NumFormat.money(record.getMontoIva()));
                    recVector.add(NumFormat.money(record.getMontoTotal()));
                    
                    cantidadItems += record.getCantidadItems().intValue();
                    subtotalNoIva += record.getSubtotalNoIva().floatValue();
                    montoIva+=record.getMontoIva().floatValue();
                    montoTotal+=record.getMontoTotal().floatValue();
                    
                    
                    dtm.addRow(recVector);
                    dataProductos=arry;
                    
                }
                this.updateTableUI();
    }
    private void updateTableUI()
    {
        ventasTable=new JTable(dtm);
        ventasTable.setDragEnabled(true);
        ventasTable.setSelectionMode(ListSelectionModel.SINGLE_INTERVAL_SELECTION);
        jScrollPane1.setViewportView(ventasTable);
        ventasTable.setFont(DefaultLookAndFeel.TableFont3);
        ventasTable.setBackground(DefaultLookAndFeel.TableBackground);
        ventasTable.setRowHeight(DefaultLookAndFeel.TableRowHeight);
        if(ventasTable.getTableHeader()!=null)
          ventasTable.getTableHeader().setReorderingAllowed(false);
        ///en caso de que haya al menos un elemento en el grid, ese lo seleccionamos 
        if(dtm.getRowCount()>0)
            this.ventasTable.getSelectionModel().setSelectionInterval(0,0);
        ventasTable.setColumnSelectionAllowed(false);
        
        DefaultTableCellRenderer precioRenderer = new DefaultTableCellRenderer();
        precioRenderer.setHorizontalAlignment(JLabel.RIGHT);
        TableColumn columnaux=ventasTable.getColumn(HistoricoGridVentas.header[HistoricoGridVentas.HEADER_CANTIDAD]);
        columnaux.setCellRenderer(precioRenderer);
        columnaux=ventasTable.getColumn(HistoricoGridVentas.header[HistoricoGridVentas.HEADER_IVA]);
        columnaux.setCellRenderer(precioRenderer);
        columnaux=ventasTable.getColumn(HistoricoGridVentas.header[HistoricoGridVentas.HEADER_SUBTOTAL]);
        columnaux.setCellRenderer(precioRenderer);
        columnaux=ventasTable.getColumn(HistoricoGridVentas.header[HistoricoGridVentas.HEADER_TOTAL]);
        columnaux.setCellRenderer(precioRenderer);
        
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_IDVENTA).setWidth(35);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_VENDEDOR).setWidth(53);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_FECHA).setWidth(67);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_CANTIDAD).setWidth(45);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_IDVENTA).setPreferredWidth(35);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_VENDEDOR).setPreferredWidth(53);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_FECHA).setPreferredWidth(67);
        ventasTable.getColumnModel().getColumn(HistoricoGridVentas.HEADER_CANTIDAD).setPreferredWidth(45);
        ventasTable.setIntercellSpacing(new Dimension(5, 2));
        if(parent!=null)
        {
        
            parent.getItemsCountTxt().setText(""+cantidadItems);
            parent.getSubtotalTxt().setText(NumFormat.money(subtotalNoIva));
            parent.getIvaTxt().setText(NumFormat.money(montoIva));
            parent.getTotalTxt().setText(NumFormat.money(montoTotal));
        
        }
        
        
        
    }

    public int getQueryType() {
        return queryType;
    }
    public void setSelectionIndex(int ndx)
    {
    	
    	ListSelectionModel lsModel = this.ventasTable.getSelectionModel();
    	if(! lsModel.isSelectionEmpty() )
    	{
    		lsModel.clearSelection();
    	}
    		
    	if(ndx>=0)
    	{
    		lsModel.setSelectionInterval(ndx, ndx); //linea necesaria
        	lsModel.setSelectionInterval(ndx, ndx);//linea necesaria NO ESTA REPETIDA
    	}
    }
    /**
     * Esta funcion lo que hace es regresar el renglon seleccionado de la tabla que existe dentro de este panel
     * @return el indice del numero de renglon que esta seleccionado en la tabla, aunque haya un rango de selecciones
     */
    public int getSelectedIndex()
    {
    	
    	ListSelectionModel lsModel = this.ventasTable.getSelectionModel();
    	int a = lsModel.getMinSelectionIndex();
    	return a;
    }
    /**
     * Esta funcion lo que hace es regresar el renglon seleccionado de la tabla que existe dentro de este panel
     * @return el indice del numero de renglon que esta seleccionado en la tabla, aunque haya un rango de selecciones
     */
    public HistoricoVentas getSelectedItem()
    {
    	
    	ListSelectionModel lsModel = this.ventasTable.getSelectionModel();
    	int a = lsModel.getMinSelectionIndex();
        HistoricoVentas historico = null;
        if(a>=0)
        {
        
            historico = (HistoricoVentas)dataProductos.get(a);
        }
    	
    	
    	
    	return historico;
    }
    /**
     * TODO Se tiene que usar este metodo para elminar los registros
     * 
     * */
    public void removeSelectedItems()
    {
        /*ArrayList histoVentassBack = new ArrayList();
        VentasTableModel dtmfiltered=new VentasTableModel(new Object[][]{},header);
        int[] ndxselected=this.ventasTable.getSelectedRows();
        if(ndxselected.length==0)
            return;
        Vector data=dtm.getDataVector();
        int auxi=0;
        ///vamos a recorrer uno a uno los renglones del detalle de venta
        //y por cada id, lo vamos a comparar con la lista de ids a borrar.
        
        for(int i=0;i<data.size();++i)
        {
            int found=0;
            
            for(int j=0;j<ndxselected.length;++j)
            {
                if(i==ndxselected[j])
                {
                    found=1;
                    break;
                }
            }
            // si NO encontramos a ese id , en la lista de ids a borrar
            //entonces tenemos que agregar a ese renglon en el nuevo dtmodel
            //porque quiere decir que el no fue seleccionado para borrarse
            if(found==0)
            {
                Vector row=(Vector)data.get(i);
                dtmfiltered.addRow(row);
                
                HistoricoVentas historicoVenta1=(HistoricoVentas)this.dataProductos.get(i);
                histoVentassBack.add(historicoVenta1);
            }
        }
        ///copiamos el dtmodel nuevo al dtm, que usa el JTable ,
        /// y de esa manera se puedan ver los registros bien filtrados
        dtm = dtmfiltered;
        dataProductos=histoVentassBack;
        
        ///si es que ya se borraron todos los renglones de la tabla de detalle de venta, 
        //entonces vamos a quitar los datos que aparecen en las cifras de control de abajo.
        if(dtm.getRowCount()==0)
        {
        	parent.getItemsCountTxt().setText("");
        	parent.getCountTxt().setText("");
        	parent.getSubtotalTxt().setText("");
        	parent.getTotalTxt().setText("");
        	parent.getIvaTxt().setText("");
        }
        this.updateTableUI();*/
    }

    public void setQueryType(int queryType) {
        this.queryType = queryType;
    }
    /** This method is called from within the constructor to
     * initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is
     * always regenerated by the Form Editor.
     */
    // <editor-fold defaultstate="collapsed" desc=" Generated Code ">//GEN-BEGIN:initComponents
    private void initComponents() {
        jScrollPane1 = new javax.swing.JScrollPane();
        ventasTable = new javax.swing.JTable();

        setLayout(new java.awt.BorderLayout());

        ventasTable.setModel(new javax.swing.table.DefaultTableModel(
            new Object [][] {
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null},
                {null, null, null, null}
            },
            new String [] {
                "TITULO 1", "Title 2", "Title 3", "Title 4"
            }
        ));
        jScrollPane1.setViewportView(ventasTable);

        add(jScrollPane1, java.awt.BorderLayout.CENTER);

    }// </editor-fold>//GEN-END:initComponents
    
    
    // Variables declaration - do not modify//GEN-BEGIN:variables
    private javax.swing.JScrollPane jScrollPane1;
    private javax.swing.JTable ventasTable;
    // End of variables declaration//GEN-END:variables
	/**
	 * @return the fecha1
	 */
	public String getFecha1() {
		return fecha1;
	}
	/**
	 * @param fecha1 the fecha1 to set
	 */
	public void setFecha1(String fecha1) {
		this.fecha1 = fecha1;
	}
	/**
	 * @return the fecha2
	 */
	public String getFecha2() {
		return fecha2;
	}
	/**
	 * @param fecha2 the fecha2 to set
	 */
	public void setFecha2(String fecha2) {
		this.fecha2 = fecha2;
	}

    public int getCantidadItems() {
        return cantidadItems;
    }

    public void setCantidadItems(int cantidadItems) {
        this.cantidadItems = cantidadItems;
    }

    public float getSubtotalNoIva() {
        return subtotalNoIva;
    }

    public void setSubtotalNoIva(float subtotalNoIva) {
        this.subtotalNoIva = subtotalNoIva;
    }

    public float getMontoIva() {
        return montoIva;
    }

    public void setMontoIva(float montoIva) {
        this.montoIva = montoIva;
    }

    public float getMontoTotal() {
        return montoTotal;
    }

    public void setMontoTotal(float montoTotal) {
        this.montoTotal = montoTotal;
    }
    public void addListSelectionListener(DetalleGridVentasSimple detalle)
    {
    	ListSelectorListener listen=new ListSelectorListener(detalle);
    	ListSelectionModel rowSM = this.ventasTable.getSelectionModel();
    	logger.info("Listener para la tabla de historico ventas fue agregado");
    	rowSM.addListSelectionListener(listen);

    }
    ///esta funcion debe llamar a la 
    public ArrayList callDao(int ndx)
    {
        logger.info("dataProductos = "+dataProductos.size());
        logger.info("vamos a acceder al indice = "+ndx);
        
        HistoricoVentas historico = (HistoricoVentas)dataProductos.get(ndx);
        Integer idVenta = historico.getIdVenta();
        logger.info("Queremos consultar el detalle de esta venta->"+historico);
        Connection conn = null;
        ArrayList arry1 =new ArrayList();
        try{
            conn = Dao.getConnection();
            logger.info("ya tengo una conexion "+conn);
            HistoricoVentasDao dao = new  HistoricoVentasDao();
            arry1 = dao.getDetalleVenta(conn,idVenta.intValue());
            logger.info("El detalle de la venta fue "+arry1);
            conn.close();
            
        }
        catch (SQLException ex)
        {
            ex.printStackTrace();
        
        }
        catch (ClassNotFoundException ex)
        {
            ex.printStackTrace();
        
        }
        return arry1;
        
    
    }
    /**
     * Este metodo sirve para exportar los registros que fueron resultado de la busqueda.
     * La exportacion se hace buscando uno a uno los detalles de cada uno de los registros de venta diaria.
     * es decir. se toma el primer resultado de la venta de ese dia. se busca su detalle y se mandan a imprimir ambos datos
     * uno es el maestro , el otro es el detalle.
     * y asi sucesivamente por cada uno de los maestros detalle que se encuentren.
     * @return
     */
    public  StringBuffer exportToCSV_ReporteVentas()
    {
    	int max=dataProductos.size();
    	
    	StringBuffer content1=new StringBuffer();
    	
    	content1.append("REGISTROS:,"+this.parent.getCountTxt().getText()+"\n");
    	content1.append("ARTICULOS:,"+this.parent.getItemsCountTxt().getText()+"\n");
    	content1.append("SUBTOTAL:,"+this.parent.getSubtotalTxt().getText()+"\n");
    	content1.append("IVA:,"+this.parent.getIvaTxt().getText()+"\n");
    	content1.append("TOTAL:,"+this.parent.getTotalTxt().getText()+"\n");
    	
    	content1.append("ID_VENTA,VENDEDOR,FECHA_VENTA,CANTIDAD,SUBTOTAL,IVA,TOTAL\n");
        
    	
    	for(int ndx=0;ndx<max;++ndx)
    	{
    		logger.info("dataProductos = "+dataProductos.size());
            logger.info("vamos a acceder al indice = "+ndx);
            
            HistoricoVentas historico = (HistoricoVentas)dataProductos.get(ndx);
            
            content1.append(historico.getIdVenta()+",");
            content1.append(historico.getNombreUsuario()+",");
            content1.append(historico.getFecha()+",");
            content1.append(historico.getCantidadItems()+",");
            content1.append(historico.getSubtotalNoIva()+",");
            content1.append(historico.getMontoIva()+",");
            content1.append(historico.getMontoTotal()+"\n");
    	}
    	
    	content1.append("\n\n\nDETALLE DE CADA VENTA\n\n\n\n");
    	for(int ndx=0;ndx<max;++ndx)
    	{
    		logger.info("dataProductos = "+dataProductos.size());
            logger.info("vamos a acceder al indice = "+ndx);
            
            HistoricoVentas historico = (HistoricoVentas)dataProductos.get(ndx);
            
            content1.append("ID_VENTA,VENDEDOR,FECHA_VENTA,CANTIDAD,SUBTOTAL,IVA,TOTAL\n");
            content1.append(historico.getIdVenta()+",");
            content1.append(historico.getNombreUsuario()+",");
            content1.append(historico.getFecha()+",");
            content1.append(historico.getCantidadItems()+",");
            content1.append(historico.getSubtotalNoIva()+",");
            content1.append(historico.getMontoIva()+",");
            content1.append(historico.getMontoTotal()+"\n");
            
            Integer idVenta = historico.getIdVenta();
            logger.info("Queremos consultar el detalle de esta venta->"+historico);
            Connection conn = null;
            ArrayList arry1 =new ArrayList();
            try{
                conn = Dao.getConnection();
                logger.info("ya tengo una conexion "+conn);
                HistoricoVentasDao dao = new  HistoricoVentasDao();
                arry1 = dao.getDetalleVenta(conn,idVenta.intValue());
                content1.append("ITEM,PRECIO_UNITARIO,CANTIDAD,MONTO\n");
                for (Iterator iter = arry1.iterator(); iter.hasNext();) {
					List row1 = (List) iter.next();
					/*arrrRecord.add(rs.getString("NOMBRE_CORTO"));
		            arrrRecord.add(new Float(rs.getFloat("PRECIO_UNITARIO")));
		            arrrRecord.add(new Integer(rs.getInt("CANTIDAD")));
		            arrrRecord.add(new Float(rs.getFloat("SUBTOTAL")));*/
					String  nombre1=(String )row1.get(0);
					Float precio1=(Float )row1.get(1);
					Integer cantidad1=(Integer )row1.get(2);
					Float subtotal1=(Float )row1.get(3);
					content1.append(nombre1+",");
		            content1.append(precio1+",");
		            content1.append(cantidad1+",");
		            content1.append(subtotal1+"\n");
				}
                logger.info("El detalle de la venta fue "+arry1);
                conn.close();
            }
            catch (SQLException ex)
            {
                ex.printStackTrace();
            
            }
            catch (ClassNotFoundException ex)
            {
                ex.printStackTrace();
            
            }
    	}
        return content1;
        
    
    }
    
    private class ListSelectorListener implements ListSelectionListener {
    	DetalleGridVentasSimple detalle;
    	public ListSelectorListener(DetalleGridVentasSimple detalle)
    	{
    		this.detalle = detalle;
    		
    		
    	}
        public void valueChanged(ListSelectionEvent e) {
            //Ignore extra messages.
            /*if (e.getValueIsAdjusting()) return;

            ListSelectionModel lsm =
                (ListSelectionModel)e.getSource();
            if (lsm.isSelectionEmpty()) {
                //no rows are selected
            } else {*/
        	ListSelectionModel lsm =
                (ListSelectionModel)e.getSource();
                int selectedRow = lsm.getMinSelectionIndex();
                ArrayList recsDetalle = new ArrayList();
                detalle.removeAll();
                if(selectedRow>=0)
                {
                	logger.info("Se selecciono el renglon "+ selectedRow);
                	recsDetalle = callDao(selectedRow);
                	detalle.addItems(recsDetalle);
                
                }
                
                
            //}
        }
    }

    
}
